<?php
/**
 * Classe DBConnection
 * Instancia um objeto PDO que representa uma conexão entre o PHP e um gerenciador de banco de dados
 * implementa o padrão factory onde uma classe DBConnection é responsável pela criação de objeto de outra classe,
 * classe PDO
 * como não podemos instânciar objetos dessa classe e a mesma não deve ser superclasse, 
 * colocamos o método construtor com visibilidade privada. isso impede que um objeto dessa classe seja criado 
*/
final class DBConnection {
	static $conn; //representa um objeto da classe PDO
	
	private function __construct(){}
	
	public static function open($connection_file) {
		//verifica se o arquivo de configuração existe
		$file = DBA.'connection_files'.DS.$connection_file;
		if(file_exists($file)) {
			//lê o arquivo de configuração .ini e retorna um array associativo com suas variáveis
			$dataDB = parse_ini_file($file);	
		}
		else {
			//caso o arquivo não exista, lança um erro
			throw new PDOException("Arquivo $connection_file não foi encontrado");
		}
		
		//lê as informações do array
		$type = $dataDB['type'];     //controlador da base de dados
		$host = $dataDB['host'];     //servidor do banco de dados
		$name = $dataDB['name'];     //nome do banco de dados
		$user = $dataDB['user'];     //nome do usuário
		$pass = $dataDB['password']; //senha do banco de dados
		
		//descobre qual é o gerenciador para abrir uma conexão com o banco de dados
		switch ($type) {
			case 'pgsql':
				self::$conn = new PDO("{$type}:dbname={$name};user={$user};password={$pass};host={$host}");
				break;
			case 'mysql':
				self::$conn = new PDO("{$type}:host={$host};dbname={$name}",$user,$pass);
				break;
			case 'mssql':
				self::$conn = new PDO("{$type}:host={$host},1433;dbname={$name}",$user,$name);
				break;
		}
		return self::$conn;			
	}
}

?>